package com.java.jvm.memory;

import java.lang.ref.PhantomReference;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
//-Xms64m -Xmx64m -XX:+PrintGC
public class CacheReferenceTests {
    /**
     * 强引用
     * 向cache存储数据时使用强引用对存储的对象进行引用。
     * 有强引用引用的对象，即便是内部不足了，也不销毁对象。
     */
    static void cacheStrongReference(){
        List<byte[]> list=new ArrayList<>();
        for(int i=0;i<1000000;i++){
            byte[] array=new byte[1024*1024];
            list.add(array);//list集合对元素强引用
        }
    }

    /**
     * 软引用：
     * 向cache存储数据时使用软引用(SoftReference)对存储的对象进行引用
     * SoftReference 引用的对象会在内存不足时进行清除
     */
    static void cacheSoftReference(){
        List<SoftReference> list=new ArrayList<>();
        for(int i=0;i<1000000;i++){
            byte[] array=new byte[1024*1024];
            list.add(new SoftReference(array));//list集合对元素强引用
        }
    }

    /**
     * 弱引用
     * 向cache存储数据时使用弱引用(WeakReference)对存储的对象进行引用
     * WeakReference 引用的对象可能会在内存GC时进行清除
     */
    static void cacheWeakReference(){
        List<WeakReference> list=new ArrayList<>();
        for(int i=0;i<1000000;i++){
            byte[] array=new byte[1024*1024];
            list.add(new WeakReference(array));//list集合对元素强引用
        }
    }
    //PhantomReference 为虚应用

    public static void main(String[] args) {
       // cacheStrongReference();
       // cacheSoftReference();
        cacheWeakReference();

    }
}
